import random
from time import sleep

from django.shortcuts import render
from django_redis import get_redis_connection
from redis import StrictRedis
from redis.client import Pipeline
from rest_framework.response import Response
from rest_framework.views import APIView

# /sms_codes/1360000000/
from celery_tasks.sms.tasks import send_sms
from meiduo_mall.libs.yuntongxun.sms import CCP
from meiduo_mall.utils.exceptions import logger


class SmsCodeView(APIView):

    def get(self,request,mobile):
        """发送短信验证码"""

        # 获取StrictRedis对象 并指定它的类型 ,就可以操作redis数据库操作保存验证码所在的库
        strict_redis = get_redis_connection('sms_codes')   # type: StrictRedis

        # 1. 校验短信码是否重复发送，是否还在有效期时间范围内
        send_flag = strict_redis.get('send_flag_%s' % mobile)
        if send_flag:  # 如果能取到1就说明已经发送过且在有效期内
            return Response({'message':'发送短信验证码过于频繁'})

        # 2.生成短信验证码 , 不够6位的话会在前面补0
        sms_code = '%06d' % random.randint(0,999999)
        logger.info('发送短信验证码：%s' % sms_code)
        # 3. 发送短信验证码(使用云通讯)
        # 注意： 测试的短信模板编号为1  ['1234', 5] 短信验证码，时间有效期
        # result = CCP().send_template_sms(mobile, [sms_code, 5], 1)
        # print(result)  # 要是返回0表示发送成功 -1则发送失败
        # sleep(5)


        # 不再用以上方法来发送短信验证码，用celery解决好的耗时操作方法来发送
        # 因为这行发送代码是在单独的一个celery进程执行的，所以我们视图在执行get的时候就不会阻塞5秒了
        send_sms.delay(mobile,sms_code)

        # 4. 保存验证码
        # # sms_13600000001  111111      （验证码：  5分钟过期）
        # # 把验证码和有效期键值的保存到redis数据库中
        # strict_redis.setex('sms_%s' % mobile, 60*5, sms_code)
        # # send_flag_13600000001  1      （发送标识： 1分钟过期） 过期后标识为0可重新发送验证码
        # strict_redis.setex('send_flag_%s' % mobile, 60, 1)

        # 优化保存验证码的redis命令代码  一次性执行两条多条命令
        # 获取pipeline对象
        pipeline = strict_redis.pipeline()     # type: Pipeline
        pipeline.setex('sms_%s' % mobile, 60*5, sms_code)
        pipeline.setex('send_flag_%s' % mobile, 60, 1)
        result = pipeline.execute()  # 一次性执行多条命令  这里得到的结果是一个列表
        print(result)
        return Response({'message':'OK'})